# 日期：2021年7月21日
# 作者：鲍发户
# 项目要求：项目分析：爬取所有最新电影详细页面所有内容，要爬取的内容有：电影名字，发布日期，宣传海报，译名，片名，年代，产地，类别，语言，字幕，上映日期，IBM评分，豆瓣评分，时长，导演，编剧，主演，标签，简介，下载链接。
# 获取内容之后存入mysql数据库中，数据库名字为dytt
import requests
from lxml import etree
import pymysql
import re

# 定义爬取范围
BASE_DOMAIN = 'https://www.dydytt.net'
HEADERS = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Referer': 'https://www.dydytt.net/html/gndy/dyzz/list_23_1.html'
}
START_URLS = [
    'https://www.dydytt.net/html/gndy/dyzz/list_23_{}.html',
    'https://www.dydytt.net/html/gndy/rihan/list_6_{}.html',
    'https://www.dydytt.net/html/gndy/oumei/list_7_{}.html',
    'https://www.dydytt.net/html/gndy/china/list_4_{}.html',
    'https://www.dydytt.net/html/gndy/jddy/list_63_{}.html',
]

# 方法内容循环获取页数目录
def get_page():
    # 获取下页的url,先查看总共多少页内容，然后将range进行修改，后期可以提升算法
    # 算法提升，得到一个起始网页的时候首先获取这个网页有多少也详情页
    for start_url in START_URLS:
        start_url = start_url.format('1')
        # 对起始页进行分析获取总页数
        resp = requests.get(start_url, headers=HEADERS)
        text = resp.text
        tree = etree.HTML(text)
        url_page = tree.xpath("//div[@class='x']//@href")[-1]
        end_page = re.findall("\d{1,3}",url_page)[-1]
        start_url = start_url.replace('1',"{}")
        for i in range(int(end_page)):
            # 找到页数之后,开始构建每一页的详细连接
            # 就是将连接中的页数进行改变改编成i+1即可
            next_url = start_url.format(str(i+1))
            # print(next_url)
            # 实现爬取
            spider(next_url)
            # next_url = BASE_DOMAIN + "/html/gndy/dyzz/list_23_" + str(i + 1) + ".html"


# 这个方法实现内容是爬取传入url中所含详细页的url然后进行遍历爬取
def spider(url):
    resp = requests.get(url, headers=HEADERS)
    # resp.content：经过编码后的字符串
    # resp.text：没有经过编码，也就是unicode字符串
    # text：相当于是网页中的源代码了
    text = resp.content.decode("gbk", errors='ignore')
    # tree：经过lxml解析后的一个对象，以后使用这个对象的xpath方法，就可以
    # 提取一些想要的数据了
    tree = etree.HTML(text)
    all_a = tree.xpath("//div[@class='co_content8']//a")
    # 爬取当页详细内容
    for a in all_a:
        href = a.xpath("@href")[0]
        detail_url = BASE_DOMAIN + href
        if href.startswith('/'):
            print(detail_url)
            try:
                crawl_detail(detail_url)
            except:
                continue
            else:
                print('爬取完成')


# 这个方法实现的内容是爬取详情页面所需要的内容
def crawl_detail(url):
    resp = requests.get(url, headers=HEADERS)
    text = resp.content.decode("gbk", errors='ignore')
    tree = etree.HTML(text)
    # 电影名字
    file_name = tree.xpath("//h1//text()")[0]
    # 发布日期
    create_time = tree.xpath("//div[@class='co_content8']/ul/text()")[0].strip()
    # 宣传海报
    pic = tree.xpath("//div[@id='Zoom']//img/@src")[0]
    # 译名，片名，年代，产地，类别，语言，字幕，上映日期，IBM评分，豆瓣评分，时长，导演，编剧，主演，标签，简介，
    infos = "".join(tree.xpath("//div[@id='Zoom']//text()")).strip().replace("◎", "\n◎")
    # 下载连接
    dl_url = tree.xpath("//div[@id='Zoom']//a/@href")[0].split('&')[0]
    insert_db(file_name, create_time, pic, infos, dl_url)


def insert_db(name, date, pic, info, dlurl):
    db = pymysql.connect(
        host="127.0.0.1",
        user='root',
        password='root',
        database='dytt',
        port=3306
    )
    cursor = db.cursor()
    sql = """
    insert into film(
        id,name,date,pic,info,dlurl
      ) 
      values(null,%s,%s,%s,%s,%s);
    """
    cursor.execute(sql, (name, date, pic, info, dlurl))
    db.commit()
    db.close()


if __name__ == '__main__':
    get_page()
